#ifndef _BSC_JT808_FRAME_CFG_H_
#define _BSC_JT808_FRAME_CFG_H_

#include "ofc/ofc_types.h"
#include "bsc_jt808_frame_object.h"

enum TBsJt808ChannelIdTag  ///< 允许rte层另外单独定义，此处保留定义 目的是兼容旧工程
{
   kBsJt808ChannelObos = 0,
   kBsJt808ChannelComm = 1,
   kBsJt808ChannelThirdVir = 2,
   kBsJt808ChannelCount = 3,
};
typedef UInt8  TBsJt808ChannelId;

TBsJt808FrameChannel *BsJt808FrameCfgChannelHandler(/*TRteBsJt808ChannelId*/UInt8 id);

Int32 BsJt808Attribute(TBsJt808FrameChannel *channel, int attr_type, void *param1, long param2);

Int32 BsJt808SetAttribute(TBsJt808FrameChannel *channel, Int32 attr_type, Int32 param);

const char *BsJt808GetChannelName(UInt8 id);

void BsJt808FrameCfgInit(TBsJt808FrameObject *frame_object, TBsJt808FrameChannelBufferParam *buffer_param);

void BsJt808FrameCfgRunOnce(TBsJt808FrameObject *frame_object);

void BsJt808FrameCfgDone(TBsJt808FrameObject *frame_object);

/**
 * 终端号转bcd
 */
void BsJt808FrameTermIdToBcd(UInt32 id, UInt8 *buffer, UInt8 size);

///队列接口
/**
 * 打开队列
 * @param queue_id: 队列索引ID
 * @return True:成功 False:失败
 */
Bool BsJt808QueueOpen(UInt16 queue_id);

/**
 * 关闭队列
 * @param queue_id: 队列索引ID
 * @return 
 */
void BsJt808QueueClose(UInt16 queue_id);

/**
 * 数据队列存入数据项
 * @param queue_id: 队列索引ID
 * @param data: 数据
 * @param size: 数据长度
 * @return 消息发送结果 大于: 实际存储长度 
 *                     小于等于:失败 参考 TDsQueueResult
 */
Int32 BsJt808QueuePush(UInt16 queue_id, const void *data, UInt32 size);

/**
 * 预读数据项
 * @param queue_id: 队列索引ID
 * @param buffer: 数据缓存
 * @param buf_size: 数据缓存长度
 * @return 消息发送结果 大于等于0: 实际数据项长度 
 *                     负数:失败 参考 TDsQueueResult
 */
Int32 BsJt808QueuePeek(UInt16 queue_id, void *buffer, UInt32 buf_size);

/**
 * 读取数据项
 * @param queue_id: 队列索引ID
 * @param buffer: 数据缓存
 * @param buf_size: 数据缓存长度
 * @return 消息发送结果 大于等于0: 实际数据项长度 
 *                     负数:失败 参考 TDsQueueResult
 */
Int32 BsJt808QueuePop(UInt16 queue_id, void *buffer, UInt32 buf_size);

/**
 * 队列含有总项数，包含已经Pop过的数据项目
 * @param queue_id: 队列索引ID
 * @return -1:失败 大于等于0: 实际数据项数
 */
Int32 BsJt808QueueTotalCount(UInt16 queue_id);

/**
 * 队列含有未Pop的项数
 * @param queue_id: 队列索引ID
 * @return -1:失败 大于等于0: 实际数据项数
 */
Int32 BsJt808QueuePopCount(UInt16 queue_id);

/**
 * 删除所有未Pop数据项
 * @param queue_id: 队列索引ID
 * @return
 */
void BsJt808QueueClear(UInt16 queue_id);

/**
 * 删除未Pop数据项
 * @param queue_id: 队列索引ID
 * @param count: 删除数据项数量
 * @return 
 */
void BsJt808QueueDelete(UInt16 queue_id, UInt32 count);

/**
 * 强制刷新队列缓冲区
 * @param queue_id: 队列索引ID
 * @return 
 */
void BsJt808QueueFlush(UInt16 queue_id);
#endif
